package eteam.aps.systeminterface.service;

import eteam.aps.systeminterface.model.dto.FlowBillClassDto;
import eteam.aps.systeminterface.model.dto.FlowOrgDto;
import eteam.aps.systeminterface.model.dto.FlowSubSystemDto;
import eteam.aps.systeminterface.model.dto.FlowUserDto;
import eteam.aps.systeminterface.model.enums.OrgTypeEnum;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * 流程引擎接口
 */
public interface IFlowController {
    //region 机构相关

    /**
     * 根据机构名称获取机构Id
     *
     * @param orgName: 机构名称
     * @return: 机构Id
     */
    @GetMapping(value = "/api/flow/getorgidbyname")
    String getOrgIdByName(@RequestParam String orgName);

    /**
     * 根据用户名称获取机构Id
     *
     * @param userName: 用户名
     * @return: 机构Id
     */
    @GetMapping(value = "/api/flow/getorgidbyusername")
    String getOrgIdByUserName(@RequestParam String userName);

    /**
     * 获取上级机构Id
     *
     * @param orgId: 当前机构Id
     * @return: 上级机构Id
     */
    @GetMapping(value = "/api/flow/getaboveorgid")
    String getAboveOrgId(@RequestParam String orgId);

    /**
     * 获取上级机构对象
     *
     * @param orgId: 当前机构Id
     * @return: 上级机构对象
     */
    @GetMapping(value = "/api/flow/getaboveorg")
    FlowOrgDto getAboveOrg(@RequestParam String orgId);

    /**
     * 获取上级代管机构Id
     *
     * @param orgId: 当前机构Id
     * @return: 上级代管机构Id
     */
    @GetMapping(value = "/api/flow/getabovesuborgid")
    String getAboveSubOrgId(@RequestParam String orgId);

    /**
     * 通过名称查找机构(模糊查询)
     *
     * @param orgName: 机构名称
     * @return: 机构信息列表
     */
    @GetMapping(value = "/api/flow/getorglistbyname")
    List<FlowOrgDto> getOrgListByName(@RequestParam String orgName);

    /**
     * 通过机构名称查找机构，精确查找
     *
     * @param orgName: 机构名称
     * @return: 机构信息
     */
    @GetMapping(value = "/api/flow/getorgbyname")
    FlowOrgDto getOrgByName(@RequestParam String orgName);

    /**
     * 通过机构Id获取机构信息
     *
     * @param orgId: 机构Id
     * @return: 机构信息
     */
    @GetMapping(value = "/api/flow/getorgbyid")
    FlowOrgDto getOrgByID(@RequestParam String orgId);

    //endregion

    //region 角色相关

    /**
     * 用户是否属于某个角色
     *
     * @param userId:   用户ID
     * @param roleName: 角色名
     * @return
     */
    @GetMapping(value = "/api/flow/userhasrole")
    boolean userHasRole(@RequestParam String userId, @RequestParam String roleName);

    /**
     * 获取所有角色名称列表(角色模板)
     *
     * @return: 角色名称列表
     */
    @GetMapping(value = "/api/flow/getrolelist")
    List<String> getRoleList();

    /**
     * 根据机构类型获取角色名称列表(角色模板)
     *
     * @param orgType: 机构类型
     * @return: 角色名称列表
     */
    @GetMapping(value = "/api/flow/getRoleListByOrgType")
    List<String> getRoleListByOrgType(@RequestParam OrgTypeEnum orgType);

    //endregion

    //region 用户相关

    /**
     * 判断用户是否存在
     *
     * @param userId: 用户ID
     * @return: 是否存在
     */
    @GetMapping(value = "/api/flow/userexist")
    boolean userExist(@RequestParam("userId") String userId);

    /**
     * 用户是否具有流程设计的权限
     *
     * @param userId: 用户ID
     * @return
     */
    @GetMapping(value = "/api/flow/hasflowdesignright")
    boolean hasFlowDesignRight(@RequestParam("userId") String userId);

    /**
     * 根据角色名称获取所有用户名称
     *
     * @param roleName: 角色名称
     * @return: 用户名列表
     */
    @GetMapping(value = "/api/flow/getusernamebyrolename")
    List<String> getUserNameByRoleName(@RequestParam String roleName);

    /**
     * 根据机构ID+角色名称获取所有用户名称
     *
     * @param orgId:    机构ID
     * @param roleName: 角色名称
     * @return: 用户名列表
     */
    @GetMapping(value = "/api/flow/getusernamebyorgid")
    List<String> getUserNameByOrgId(@RequestParam String orgId, @RequestParam String roleName);

    /**
     * 根据机构Id获取用户ID列表
     *
     * @param orgId: 机构ID
     * @return: 用户ID列表
     */
    @GetMapping(value = "/api/flow/getuseridsbyorgid")
    List<String> getUserIdsByOrgId(@RequestParam String orgId);

    /**
     * 通过用户登录名、姓名、拼音码查找用户信息
     *
     * @param keyWord: 检索关键字【登录名、姓名、拼音码】
     * @return: 用户信息列表
     */
    @GetMapping(value = "/api/flow/getuserlistbykeyword")
    List<FlowUserDto> getUserListByKeyWord(@RequestParam String keyWord);

    /**
     * 根据机构ID+角色名称获取所有用户信息
     *
     * @param orgId:    机构ID
     * @param roleName: 角色名称
     * @return: 用户信息列表
     */
    @GetMapping(value = "/api/flow/getusersbyrolename")
    List<FlowUserDto> getUsersByRoleName(@RequestParam String orgId, @RequestParam String roleName);

    /**
     * 根据机构Id获取所有用户信息
     *
     * @param orgId: 机构ID
     * @return: 用户信息列表
     */
    @GetMapping(value = "/api/flow/getusersbyorgid")
    List<FlowUserDto> getUsersByOrgId(@RequestParam String orgId);

    /**
     * 通过用户Id获取用户信息
     *
     * @param userId: 用户ID
     * @param orgId:  机构ID
     * @return: 用户信息
     */
    @GetMapping(value = "/api/flow/getuserbyid")
    FlowUserDto getUserById(@RequestParam String userId, @RequestParam String orgId);

    /**
     * 通过身份证号获取用户Id
     *
     * @param idCardNo: 身份证ID
     * @return: 用户ID
     */
    @GetMapping(value = "/api/flow/getuseridbyidcardno")
    String getUserIdByIDCardNo(@RequestParam String idCardNo);

    //endregion

    //region 子系统相关

    /**
     * 获取所有子系统
     *
     * @return: 子系统列表
     */
    @GetMapping(value = "/api/flow/getallsystem")
    List<FlowSubSystemDto> getAllSystem();

    /**
     * 获取所有单据信息
     *
     * @return: 单据列表
     */
    @GetMapping(value = "/api/flow/getallbillinfo")
    List<FlowBillClassDto> getAllBillInfo();

    //endregion
}
